package dao

import (
	"fmt"
	"go-demo/model"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// 第一个括号表示传入的数据，第二个括号表示要返回的数据
var Db *gorm.DB

// 配置MySQL连接参数
const USERNAME = "root"     //账号
const PASSWORD = "123456"   //密码
const HOST = "127.0.0.1"    //数据库地址，可以是Ip或者域名
const PORT = 3306           //数据库端口
const DBNAME = "gorm_class" //数据库名
const TIMEOUT = "10s"       //连接超时，10秒

func Init() {
	//创建数据库连接
	Connection()
	//创建数据库表
	CreateTable()
	//初始化用户数据
	//GetAllToken()
}

// 连接数据库，并返回连接的db和错误信息
func Connection() {
	var err error
	//拼接下dsn参数, dsn格式可以参考上面的语法，这里使用Sprintf动态拼接dsn参数，因为一般数据库连接参数，我们都是保存在配置文件里面，需要从配置文件加载参数，然后拼接dsn。
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local&timeout=%s", USERNAME, PASSWORD, HOST, PORT, DBNAME, TIMEOUT)
	//连接MYSQL, 获得DB类型实例，用于后面的数据库读写操作。
	Db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("连接数据库失败, error=" + err.Error())
	}
}

// 首次创建引用
func CreateTable() {
	var err error
	// 创建Author表
	err = Db.AutoMigrate(&model.User{})
	if err != nil {
		panic("Failed to create User table!")
	}
	// 创建Video表
	err = Db.AutoMigrate(&model.Video{})
	if err != nil {
		panic("Failed to create Video table!")
	}

	// 创建Comment表
	err = Db.AutoMigrate(&model.Comment{})
	if err != nil {
		panic("Failed to create Comment table!")
	}

	// 创建Like表
	err = Db.AutoMigrate(&model.Like{})
	if err != nil {
		panic("Failed to create Like table!")
	}

	// 创建FollowEvent表
	err = Db.AutoMigrate(&model.FollowEvent{})
	if err != nil {
		panic("Failed to create FollowEvent table!")
	}

	// 创建MessageSendEvent表
	err = Db.AutoMigrate(&model.MessageSendEvent{})
	if err != nil {
		panic("Failed to create MessageSendEvent table!")
	}
}
